Uvod

Kako bi programeri uspjeli držati korak sa zahtjevnim potrebama tržišta koje se u današnje vrijeme mijenja iz dana u dan, bilo je potrebno zamijeniti neke starije tradicionalne pristupe programiranju. Osnovni cilj svakog programera je učiniti mnogo u što kraćem vremenu na najjednostavniji mogući način. Objektno orijentirano programiranje (OOP) je jedan od programerskog pristupa koji uvelike pridonosi ostvarenju navedenog cilja jer je njegova svrha omogućiti korištenje već napisanog koda u svojim programima. Kako većina današnjih aplikacija ima izbornike, forme i slično, odnosno koriste jednake elemente, bilo bi uistinu nepraktično svaki puta ispočetka pisati cijeli kod za rad s takvim elementima. Rješenje je omogućiti korištenje koda za takve elemente koji je već netko definirao i kasnije mijenjati veličine, akcije i ostalo po potrebi.

Objektno orijentirano programiranje je pristup koji omogućuje da nakon što napišemo npr. funkciju koja će izračunati ukupan broj sati u godini, više nikada nemoramo tu funkciju pisati. Naime, ne samo da ju ne moramo pisati, već ju ne moramo niti kopirati u nove programe i aplikacije, već ju samo možemo „zapakirati“ i pozvati u svojim programima. Već zvuči praktično i korisno? Naravno, postoji još prednosti OOP-a, a jedna od značajnijih je i jednostavno ispravljanje pogriješaka ili omogućavanje bilo kakvih izmjena. Dakle, ukoliko primjetimo da nekakva funkcija ne radi dobro, zahvaljujući tome što smo ju samo pozvali u ostalim programima, dovoljno je samo izmijeniti pogriješku te funkcije na jednom mjestu i automatski će ispravno raditi u svim drugim programima.

Ovakav pristup programiranju uvelike olakšava rad programerima, skraćuje vrijeme potrebno za izradu aplikacije i pridonosi dobroj organizaciji i urednom pisanju koda, jer niti jedan programer ne voli vidjeti neuredno napisani kod. Također, ukoliko više ljudi radi na projektu, ili nakon nekog vremena netko novi dođe raditi na napola završenom projektu, vrlo je lako snaći se u objektno orijentirano napisanom kodu, pregledniji je i organiziraniji. Kako biste shvatili princip na kojem OOP funkcionira, u nastavku ćemo pojasniti što su to klasa i objekt i zašto su važni za OOP.

Neki od najpoznatijih objektno orijentiranih programskih jezika (a popis je poprilično dugačak) su: C++, Java, C#, Phyton i PHP koji ćemo koristiti u primjerima.

Slika 1. Objekt, svojstvo, metoda

Klasa i Objekt

Klasa sadrži općenita svojstva i predstavlja svojevrstan predložak za objekt. Nakon što neku klasu detaljno opišemo, ona sama postaje objekt, dakle objekt je konkretizacija klase. Takva konkretizacija klase odnosno definiranje osnovnih svojstava klase nazivamo kreiranje objekta.

Konkretno, ukoliko kažemo 'automobil', mislimo na čitavu klasu automobila, odnosno na sve automobile koji postoje. Međutim, kažemo li npr. crveni Citroen C3, izbor automobila je uvelike smanjen i znamo da se odnosi samo na crvene automobile marke Citroen, tip C3. Osim toga, možemo znati i registarske oznake, jačinu motora, godinu proizvodnje, ali i sve o vlasniku automobila. Nakon što znamo sve te detalje, više ne govorimo o klasi automobila, već o konkretnom automobilu, odnosno objektu automobil.

Slika 2. Klasa = Automobil, objekt = Opel

Klase općenito imaju nekakva svojstva (npr. kod automobila mogu biti marka, tip...), ali osim svojstava, nad klasama je također moguće izvršavati i određene radnje. Neke radnje svojstvene automobilima su primjerice upali motor, ubaci u prvu brzinu, dodaj gas i dr. Slično je i u programiranju, odnosno klase mogu imati neka svojstva, ali i radnje koje će nad klasama moći izvršavati tzv. metode. Svojstva će tako biti neke globalne varijable, a metode će biti funkcije definirane unutar neke klase. Svojstva i metode zajednički nazivamo elementima klase.

Slika 3. Metoda i svojstvo

Private i Public

Cilj klase je da njezinim svojstvima i metodama osiguramo pristup iz drugih klasa. Primjerice, ukoliko definiramo klasu koja sadrži metodu koja će „obojiti“ auto u određenu boju, tada želimo toj metodi pristupiti i iz drugih klasa. Da bismo svojstvu ili metodi neke klase mogli pristupiti iz druge klase, one trebaju biti označene kao public (javne).

//public
public $boja;

//public
public function construct($boja){
$this -> boja = $boja;
}

//public
public function Oboji(){
echo 'Boja: '.$this -> boja;
}

Slika 4. Public metode

Osim public, klasa može imati i private metode koje se ne trebaju moći pozvati u drugim klasama. Primjerice, klasa u kojoj se nalazi metoda koja pruža uvid u registarske oznake auta ne bi trebala biti javno dostupna, odnosno treba biti privatna i nju ne moramo moći pozivati iz drugih klasa, isti slučaj je i sa lozinkama i drugim povjerljivim podacima.

Za sljedeći primjer poslužit ćemo se principo učahurivanja. Ućahurivanje je skrivanje lokalnih svojstava i omogućavanje njihovom manipulacijom kroz javne funkcije.

Slika 5. Primjer učahurivanja

U primjeru vidimo kako GET služi za dohvaćanje podataka, dok SET postavlja. Boju smo prvo postavili pomoću konstruktora, a zatim kroz javnu funkciju.

Konstruktor

Konstruktor klase je metoda unutar klase koja ima isto ime kao klasa, a ne vraća nikakav tip. Dakle, konstruktor se izvršava prilikom kreiranja objekta, ali ne vraća nikakvu vrijednost, a namjena mu je inicijaliziranje svojstava objekta, odnosno postavljanje svojstava na neku početnu vrijednost. Jedna klasa može imati jedan ili više konstruktora, ali koja je namjena više konstruktora? Kako dvije ili više metoda imaju isto ime i kako će klasa znati koju metodu treba izvršiti? Radi se o tome da ukoliko klasa ima dva ista konstruktora, oni moraju imati različit broj parametara. Objekt je moguće kreirati bez znanja vrijednosti svih svojstava pa će se u tom slučaju svojstva postaviti na neke inicijalne vrijednosti, a vrijednosti ćemo definirati kada ih saznamo. Primjerice, ukoliko imamo klasu automobil, nije nužno da prilikom kreiranja objekta tipa automobil znamo sva njegova svojstva. Tada ćemo svojstva inicijalizirati na neke početne vrijednosti npr. maksimalna brzina će biti 200 km/h ukoliko nije drukčije rečeno. U slučaju da prilikom kreiranja objekta znamo vrijednosti svih svojstava klase, možemo kreirati objekt s tim svojstvima.

U prvom slučaju pozivamo kontruktor bez parametara, onaj koji će svojstva inicijalizirati na neku početnu vrijednost (najčešće 0 ako se radi o numeričkim vrijednostima, ili prazan string ako se radi o tekstualnim vrijednostima). U drugom slučaju pozivamo konstruktor sa parametrima koji vrijednosti svojstava postavljaju na vrijednosti koje smo proslijedili preko parametara.

Nasljeđivanje

Važan koncept u objektno-orijentiranom programiranju je nasljeđivanje, koje je proces stjecanja obilježja prethodnika. Kod objektno-orijentiranog programiranja, jednom kada se kreira objekt, mogu se razvijati novi objekti koji posjeduju sva obilježja originalnog objekta plus bilo koja nova obilježja koja programer poželi. Prilikom nasljeđivanja kreira se „opća“, bazna ili nadređena klasa (superclass). Podređenim ili izvedenim klasama (subclass) je bazna klasa nadređena i one nasljeđuju njezina svojstva. Često se koriste i nazivi roditeljska klasa (parent class) i klasa dijete (child class). Roditeljska klasa je klasa koja se koristi kao baza za nasljeđivanje, a od nje nasljeđuje klasa dijete. Jedan od glavnih pokazatelja odnosa između baza je veličina. Iako nije pravilo, u većini slučajeva izvedena klasa je veća od bazne klase u smislu da ima dodatna polja i metode. Ona možda izgleda manjom zbog manje veličine ispisanog koda, ali je veća jer je naslijedila sva polja i metode roditeljske klase te još tome pridodaje vlastita nova polja i metode. Izvedena klasa može biti i dalje proširena, to jest može imati vlastite izvedene klase. Te klase mogu dalje imati svoje izvedene klase i tako dalje dokle god je potrebno za funkcioniranje aplikacije. Cijela lista roditelja i djece klase čini popis predaka bazne klase. OOP razlikuje tri vrste nasljeđivanja. Prva vrsta nasljeđivanja odgovara s nasljeđivanjem sučelja u programima. Ovo nasljeđivanje je ključno u programiranju. Ako objekt nasljeđuje sučelje svoga roditeljskog objekta, onda taj objekt nudi isto što i roditeljski objekt, te je stoga sposoban oponašati roditeljsku instancu. Ovo nasljeđivanje ne primjenjuje se samo na sučeljima, nego i u implementaciji posebnih tipova datoteka od strane klasa. Drugo je nasljeđivanje implementacije koje se nameće u nasljeđivanju klasa. Objekt preuzima ne samo sučelje nego i cijelu implementaciju. Zbog toga taj objekt ne mora definirati svoju vlastitu metodu, nego koristi metode roditeljskog objekta. I zadnje, treće, je prirodno nasljeđivanje koje govori o tome kako se gleda na specijalizaciju objekata bez obzira na programiranost. Dobro programiran program sadrži sve tri vrste nasljeđivanja koje su u skladu.

Slika 6. Nasljeđivanje

stdClass

stdClass je prazan razred unutar PHP dokumenta koji nema svojstva, metode ili roditelje. Koristeći PHP stdClass značajke možemo stvoriti objekt i dodijeliti mu podatke, bez da formalno definiramo klasu. Pretpostavimo da smo brzo stvoriti novi objekt za držanje nekih podataka o autima. To bi izgledalo ovako:

Slika 8. Primjer korištenja stdClass razreda

Na ovaj način kasnije možemo pristupiti navedenim podacima tako što ćemo pozvati $auto→proizvodac itd.

Zaključak

Objektno orijentirano programiranje je način programiranja koji bi svatko tko se bavi ovim područjem trebao poznavati. Kod je uredan i pregledan, jednostavan za snalaženje, a pojedini dijelovi koriste se kao zasebne cjeline i mogu se upotrebljavati zasebno u različitim projektima, dakle međusobno su neovisni. Nakon kratkih osnova i uvoda u OOP, ostalo je na vama, napravite nekoliko manjih aplikacija, napravite include postojećih metoda i objekata, međusobno ih kombinirajte i otkrijte što sve nudi objektno orijentirano programiranje!

Literatura

PHP:OOP

URL: http://www.bug.hr/forum/topic/razvoj-web-stranica/php-oop-objektno-orjentirano-programiranje/34189.aspx

Objektno orjentirano programiranje

URL: http://marjan.fesb.hr/~mateljan/cpp/slides15-OOP-slides.pdf

OOP predavanje

URL: https://www.youtube.com/watch?v=8Braf09SxD4

Jakopović, Dražen. Java i objektno orjentirano programiranje

URL:http://www.gimnazija-treca-os.skole.hr/dokumenti?dm_document_id=1627&dm_det=1#mod_docman